package proxy.demo4;

import proxy.demo1.IUserDao;
import proxy.demo1.UserDaoImpl;

import java.lang.reflect.Proxy;

/**
 * jdk动态代理实现
 */
public class JdkDynamicProxyDemo {
    public static void main(String[] args) {
        // 1. 创建真实对象
        IUserDao realService = (IUserDao) new UserDaoImpl();
        // 2. 创建代理处理器，绑定真实对象
        UserServiceProxyHandler handler = new UserServiceProxyHandler(realService);
        // 3. 生成代理对象（动态生成实现接口的代理类）‌:ml-citation{ref="1,2" data="citationList"}
        IUserDao proxy = (IUserDao) Proxy.newProxyInstance(
                IUserDao.class.getClassLoader(),  // 类加载器
                new Class[]{IUserDao.class},     // 目标接口数组
                handler                             // 代理逻辑处理器
        );
        // 4. 调用代理方法
        proxy.save();


    }

    public void test() {
        IUserDao realService = (IUserDao) new UserDaoImpl();
        IUserDao proxy1 = (IUserDao) Proxy.newProxyInstance(
                IUserDao.class.getClassLoader(),  // 类加载器
                new Class[]{IUserDao.class},     // 目标接口数组
                // 代理逻辑处理
                (proxy2, method, args) -> {
                    System.out.println("代理逻辑处理");
                    method.invoke(realService, args);
                    return method.invoke(realService, args);
                }

        );
        // 调用代理方法
        proxy1.save();

    }
}
